home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / python2.4 / multifile.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2005-10-18  |  5KB  |  191 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. '''A readline()-style interface to the parts of a multipart message.
  5.  
  6. The MultiFile class makes each part of a multipart message "feel" like
  7. an ordinary file, as long as you use fp.readline().  Allows recursive
  8. use, for nested multipart messages.  Probably best used together
  9. with module mimetools.
  10.  
  11. Suggested use:
  12.  
  13. real_fp = open(...)
  14. fp = MultiFile(real_fp)
  15.  
  16. "read some lines from fp"
  17. fp.push(separator)
  18. while 1:
  19.         "read lines from fp until it returns an empty string" (A)
  20.         if not fp.next(): break
  21. fp.pop()
  22. "read remaining lines from fp until it returns an empty string"
  23.  
  24. The latter sequence may be used recursively at (A).
  25. It is also allowed to use multiple push()...pop() sequences.
  26.  
  27. If seekable is given as 0, the class code will not do the bookkeeping
  28. it normally attempts in order to make seeks relative to the beginning of the
  29. current file part.  This may be useful when using MultiFile with a non-
  30. seekable stream object.
  31. '''
  32. __all__ = [
  33.     'MultiFile',
  34.     'Error']
  35.  
  36. class Error(Exception):
  37.     pass
  38.  
  39.  
  40. class MultiFile:
  41.     seekable = 0
  42.     
  43.     def __init__(self, fp, seekable = 1):
  44.         self.fp = fp
  45.         self.stack = []
  46.         self.level = 0
  47.         self.last = 0
  48.         if seekable:
  49.             self.seekable = 1
  50.             self.start = self.fp.tell()
  51.             self.posstack = []
  52.         
  53.  
  54.     
  55.     def tell(self):
  56.         if self.level > 0:
  57.             return self.lastpos
  58.         
  59.         return self.fp.tell() - self.start
  60.  
  61.     
  62.     def seek(self, pos, whence = 0):
  63.         here = self.tell()
  64.         if whence:
  65.             if whence == 1:
  66.                 pos = pos + here
  67.             elif whence == 2:
  68.                 if self.level > 0:
  69.                     pos = pos + self.lastpos
  70.                 else:
  71.                     raise Error, "can't use whence=2 yet"
  72.             
  73.         
  74.         if (not None if pos <= pos else pos <= here or self.level > 0) and pos > self.lastpos:
  75.             raise Error, 'bad MultiFile.seek() call'
  76.         
  77.         self.fp.seek(pos + self.start)
  78.         self.level = 0
  79.         self.last = 0
  80.  
  81.     
  82.     def readline(self):
  83.         if self.level > 0:
  84.             return ''
  85.         
  86.         line = self.fp.readline()
  87.         if not line:
  88.             self.level = len(self.stack)
  89.             self.last = self.level > 0
  90.             if self.last:
  91.                 raise Error, 'sudden EOF in MultiFile.readline()'
  92.             
  93.             return ''
  94.         
  95.         if not self.level == 0:
  96.             raise AssertionError
  97.         if self.is_data(line):
  98.             return line
  99.         else:
  100.             marker = line.rstrip()
  101.         for i, sep in enumerate(reversed(self.stack)):
  102.             if marker == self.section_divider(sep):
  103.                 self.last = 0
  104.                 break
  105.                 continue
  106.             if marker == self.end_marker(sep):
  107.                 self.last = 1
  108.                 break
  109.                 continue
  110.         else:
  111.             return line
  112.         if self.seekable:
  113.             self.lastpos = self.tell() - len(line)
  114.         
  115.         self.level = i + 1
  116.         if self.level > 1:
  117.             raise Error, 'Missing endmarker in MultiFile.readline()'
  118.         
  119.         return ''
  120.  
  121.     
  122.     def readlines(self):
  123.         list = []
  124.         while None:
  125.             line = self.readline()
  126.             if not line:
  127.                 break
  128.             
  129.         return list
  130.  
  131.     
  132.     def read(self):
  133.         return ''.join(self.readlines())
  134.  
  135.     
  136.     def next(self):
  137.         while self.readline():
  138.             pass
  139.         if self.level > 1 or self.last:
  140.             return 0
  141.         
  142.         self.level = 0
  143.         self.last = 0
  144.         if self.seekable:
  145.             self.start = self.fp.tell()
  146.         
  147.         return 1
  148.  
  149.     
  150.     def push(self, sep):
  151.         if self.level > 0:
  152.             raise Error, 'bad MultiFile.push() call'
  153.         
  154.         self.stack.append(sep)
  155.         if self.seekable:
  156.             self.posstack.append(self.start)
  157.             self.start = self.fp.tell()
  158.         
  159.  
  160.     
  161.     def pop(self):
  162.         if self.stack == []:
  163.             raise Error, 'bad MultiFile.pop() call'
  164.         
  165.         if self.level <= 1:
  166.             self.last = 0
  167.         else:
  168.             abslastpos = self.lastpos + self.start
  169.         self.level = max(0, self.level - 1)
  170.         self.stack.pop()
  171.         if self.seekable:
  172.             self.start = self.posstack.pop()
  173.             if self.level > 0:
  174.                 self.lastpos = abslastpos - self.start
  175.             
  176.         
  177.  
  178.     
  179.     def is_data(self, line):
  180.         return line[:2] != '--'
  181.  
  182.     
  183.     def section_divider(self, str):
  184.         return '--' + str
  185.  
  186.     
  187.     def end_marker(self, str):
  188.         return '--' + str + '--'
  189.  
  190.  
  191.